#include "Multigrid_One_Dimension.hpp"
#include "Multigrid_Two_Dimension.hpp"
#include "Input.hpp"
#include <iostream>
#include <cmath>


class InitialGuess : public Function_One_Dimension
{
public:
    double operator()(double x) const override
    {
        return 0;
    }
};

class SourceTerm : public Function_One_Dimension
{
public:
    double operator()(double x) const override
    {
        return M_PI * M_PI * std::sin(M_PI * x); // π² sin(πx)
    }
};

int main()
{
    // 设置多重网格参数
    // MGParams_One_Dimension mg_params;
    // mg_params.grid_resolution = 125;                                // 网格分辨率
    // mg_params.restriction = MGParams_One_Dimension::full_weighting; // 限制算子
    // mg_params.interpolation = MGParams_One_Dimension::linear;       // 插值算子
    // mg_params.v1 = 20;
    // mg_params.v2 = 40;
    // mg_params.type = MGParams_One_Dimension::V_Cycles; // V循环
    // mg_params.max_iterations = 30;                     // 最大迭代次数
    // mg_params.relative_accuracy = 1e-6;                // 相对精度
    // mg_params.recursions = 2;
    // mg_params.initial_guess = std::make_shared<InitialGuess>(); // 初始猜测
    // 设置边界条件
    // BoundaryConditions_One_Dimension bc;
    // bc.type = BoundaryConditions_One_Dimension::DIRICHLET; // Dirichlet边界条件
    // bc.value = {0, 0}; // 边界值
    // bc.type = BoundaryConditions_One_Dimension::NEUMANN; // NEUMANN边界条件
    // bc.value = {M_PI, -M_PI};                            // 边界值
    // bc.one_point = {0.5, 1};
    // bc.type = BoundaryConditions_One_Dimension::Mixed; // Mixed边界条件
    // bc.flag = {0,1};
    // bc.value = {0, -M_PI}; // 边界值
    // bc.one_point = {0.5, 1};
    // 创建源项函数
    // std::shared_ptr<SourceTerm> source_term = std::make_shared<SourceTerm>();
    // Initialization(mg_params, bc, source_term);
    // std::cout<<bc.type<<std::endl;
    //std::shared_ptr<Function_One_Dimension> source_term;

    Initialization();

    return 0;
}